#include "debug.h"
#include "../DDIC/AllDDIC.h"

/*RM9300 Gamma寄存器位址*/
u8 ICNA3310_Gamma_r[54]= {
   0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,
   0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,
   0x26,0x27,0x28,0x29,0x2a,0x2b,0x2d,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37
};
u8 ICNA3310_Gamma_g[54]= {   
	0x38,0x39,0x3A,0x3B,0x3D,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,
	0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,
	0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70	
};
u8 ICNA3310_Gamma_b[54]={
	0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,
	0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,
	0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7
};

void ICNA3310_Write_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void ICNA3310_Read_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void ICNA3310_Gamma_OTP_Start(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void ICNA3310_auto_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);


void ICNA3310_Write_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
    u8 buffer1[5];
    SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0XFFFD);	
	delay_ms(5);
			
    if((buffer[3]&0x03) == 0x00)//根据gamma切换不同页page
    {
        buffer1[0] = 0x02;
        buffer1[1] = 0xFE;
        buffer1[2] = 0x50;                // GAMMA1  
    }	
    else if((buffer[3]&0x03) == 0x01)
    {  
        buffer1[0] = 0x02;
        buffer1[1] = 0xFE;
        buffer1[2] = 0x60;                // GAMMA2  
    }   
    else if((buffer[3]&0x03) == 0x02)
    {
        buffer1[0] = 0x02;
        buffer1[1] = 0xFE;
        buffer1[2] = 0x30;                // GAMMA3 
    }
	
    else if((buffer[3]&0x03) == 0x03)
    {
        buffer1[0] = 0x02;
        buffer1[1] = 0xFE;
        buffer1[2] = 0xA0;                // GAMMA4 
    }	
    SSD2828_W_Array(SigMode,channel,buffer1,0);	
	
	if((buffer[3]&0x80) == 0x80) //27绑点
	{
		buffer1[0] = 0x02;	
		buffer1[1] = 0xAB;
		buffer1[2] = 0x01;  
	}
	else
	{
		buffer1[0] = 0x02; //13绑点	
		buffer1[1] = 0xAB;
		buffer1[2] = 0x81;  		
	}	
	SSD2828_W_Array(SigMode,channel,buffer1,0); 	
	
    for( i = 0;i<buffer[2]-1;i++) 
    {	 
		if((buffer[3]&0x70)==0x10) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|ICNA3310_Gamma_r[i]);  
		else if((buffer[3]&0x70)==0x20) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|ICNA3310_Gamma_g[i]); 
		else if((buffer[3]&0x70)==0x30) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|ICNA3310_Gamma_b[i]); 
		delay_ms(3);
    }
		
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
    buffer[4] = Uart_Error_None;
    STM2PC_RM671xx(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 写Gamma状态  ：ok  
		//ICNA3310_w_end: ;
}

void ICNA3310_Read_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
    u8 buffer1[3];
	SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
   //SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
	delay_ms(15);
	buffer1[0] = 0x02;        
    if((buffer[3]&0x03) == 0x00)      //Gamma1 
    {  
		buffer1[1] = 0xFE;
		buffer1[2] = 0x50;      
    }
    else if((buffer[3]&0x03) == 0x01) //Gamma2 
    {  
        buffer1[1] = 0xFE;       
        buffer1[2] = 0x60;      
    }
    else if((buffer[3]&0x03) == 0x02) //Gamma3 
    {  
        buffer1[1] = 0xFE;        
        buffer1[2] = 0x30;           
    }
    else if((buffer[3]&0x03) == 0x02) //Gamma4
    {  
        buffer1[1] = 0xFE;        
        buffer1[2] = 0xA0;           
    }		
	SSD2828_W_Array(SigMode,channel,buffer1,0); 
	delay_ms(5);
	if((buffer[3]&0x80) == 0x80) //27绑点
	{
		buffer1[0] = 0x02;	
		buffer1[1] = 0xAB;
		buffer1[2] = 0x01;  
	}
	else
	{
		buffer1[0] = 0x02; //13绑点		
		buffer1[1] = 0xAB;
		buffer1[2] = 0x81;  		
	}	
	SSD2828_W_Array(SigMode,channel,buffer1,0); 	
	delay_ms(5);		
    SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data|0x0080); 
    SSD2828_W_Reg(SigMode,channel,0xBC,0x0001);	
    for( i = 0;i<buffer[2]-1;i++)			 	
    {  	        
        SSD2828_W_Reg(SigMode,channel,0xC1,0x0002);                                
        buffer1[0] = 0x01;
		buffer1[1] = ((buffer[3]&0x70)==0x10) ? ICNA3310_Gamma_r[i] : (((buffer[3]&0x70)==0x20) ? ICNA3310_Gamma_g[i] : ICNA3310_Gamma_b[i]);
        SSD2828_W_Array(SigMode,channel,buffer1,0); 
		delay_ms(6);
        buffer[4+i]=SSD2828_R_Reg(SigMode,channel,0xFF);        
    }
    delay_ms(5);
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
    STM2PC_RM671xx(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 读取的 Gamma数据  ：ok  
}


void ICNA3310_Gamma_OTP_Start(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
//    u16 tmp;
    u8 buffer1[3];  
	SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);  
    delay_ms(15);
    buffer1[0] = 0x01;
    buffer1[1] = 0x28;
    SSD2828_W_Array(SigMode,channel,buffer1,0);     // 关显示 	
    delay_ms(5);		
    buffer1[0] = 0x02;
    buffer1[1] = 0xFE;
    buffer1[2] = 0x40;
    SSD2828_W_Array(SigMode,channel,buffer1,0);     // UCS用户选择
	
	

    delay_ms(100);  //otp
    buffer1[0] = 0x02;
    buffer1[1] = 0xFE;
    buffer1[2] = 0x01; 
    SSD2828_W_Array(SigMode,channel,buffer1,0);     //Page0
    
	if(buffer[1]==0x0A)  //otp GammaSet1 F0 D[4]:0001-0000
    {
        buffer1[0] = 0x02;
			  buffer1[1] = 0xF0;
        buffer1[2] = 0x10; 
        SSD2828_W_Array(SigMode,channel,buffer1,0);     //OTP_CMD2_P1_PGM_EN          
    }
    if(buffer[1]==0x0D)  //otp GammaSet2 F0 D[3]:0000-1000
    {
        buffer1[0] = 0x02;
			  buffer1[1] = 0xF0;
        buffer1[2] = 0x08; 
        SSD2828_W_Array(SigMode,channel,buffer1,0);     //OTP_CMD2_P6_PGM_EN  
    }
    if(buffer[1]==0x0E) //otp GammaSet3  F6 D[4]:0001-0000
    {		
        buffer1[0] = 0x02;
			  buffer1[1] = 0xF6;
        buffer1[2] = 0x10;        
        SSD2828_W_Array(SigMode,channel,buffer1,0);     //OTP_CMD2_P8_PGM_EN  
    }
    if(buffer[1]==0x0F) // otp goa
    {
        buffer1[0] = 0x02;
			  buffer1[1] = 0xF0;
        buffer1[2] = 0x04; 
        SSD2828_W_Array(SigMode,channel,buffer1,0);     //OTP_CMD2_P2_PGM_EN  
    }
    if(buffer[1]==0x10) // otp All
    {
//      /////// otp power  
//			buffer1[0] = 0x02;
//        buffer1[1] = 0xF0;///0xF6
//        buffer1[2] = 0xA0;////0x08	      
	
			/////// otp All  page 40\70\80\90\10\20
			buffer1[0] = 0x02;
        buffer1[1] = 0xF0;///0xF6
        buffer1[2] = 0xA6;////0x08	    			
        SSD2828_W_Array(SigMode,channel,buffer1,0);     //  
			
			////page  
			buffer1[0] = 0x02;
        buffer1[1] = 0xF6;///0xF6
        buffer1[2] = 0x4C;////0x08	    			
        SSD2828_W_Array(SigMode,channel,buffer1,0);     //  
    }    

    buffer1[0] = 0x02;//MTPCTR
    buffer1[1] = 0xF2;
    buffer1[2] = 0x03;
    SSD2828_W_Array(SigMode,channel,buffer1,0);    
	
    buffer1[0] = 0x02;
    buffer1[1] = 0xF3;
    buffer1[2] = 0xA5;
    SSD2828_W_Array(SigMode,channel,buffer1,0);  

    buffer1[0] = 0x02;
    buffer1[1] = 0xF4;
    buffer1[2] = 0x5A;
    SSD2828_W_Array(SigMode,channel,buffer1,0);  

    buffer1[0] = 0x02;
    buffer1[1] = 0xF5;
    buffer1[2] = 0x3C;
    SSD2828_W_Array(SigMode,channel,buffer1,0);  		
                      
    delay_ms(1500);         // wait for >400 ms   

    buffer[4] = Uart_Error_Oth;
    STM2PC_RM671xx(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 写OTP状态  ：ok
}
void ICNA3310_auto_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
//	u8 buffer1[3];
    SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0XFFFD);	
	delay_ms(5);	
	
//	buffer1[0] = 0x02;
//	buffer1[1] = 0xFE;
//	buffer1[2] = 0x50;                // GAMMA1  	
//	SSD2828_W_Array(SigMode,channel,buffer1,0); 
//	delay_ms(5);	
	SSD2828_W_Reg(SigMode,channel,0xBC,0x02);	
    for( i = 0;i<buffer[2];i++) 
    {	 
		SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|buffer[i+3]);  
		i++;
		delay_ms(2);
    }				
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
}


void ProcessForIc57( USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8 buffer[],u16 LP_B7_Data,u16 HS_B7_Data)//ADD BY PCS
{
	switch(buffer[1]&0xFF)
	{
		case 0x08:                                      //写Gamma
			ICNA3310_Write_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
		break;
		case 0x09:                                      //读Gamma
			ICNA3310_Read_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); 
		break;
		case 0x07:
			ICNA3310_Gamma_OTP_Start(pdev,ep_addr,SigMode ,channel,buffer, LP_B7_Data,HS_B7_Data);//原来的
		break;
		case 0xDD:           // auto Gamma
			ICNA3310_auto_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
		break;
		default:break;
	}	
	
}





 


